
.text

.globl stdin

string_to_digit: # ф-ція перетворення строки ascii в число - string_to_digit(string_in)
    pushl %ebp
    movl %esp, %ebp

    subl $12, %esp

    movl 8(%ebp), %ebx # заносимо адрес строки в %ebx
    movl $0, -4(%ebp) # змінна digit_out
    movl $10, -12(%ebp) # множимо завжди на 10

    jmp .string_to_digitCMP
.string_to_digitLBODY:
    xorl %ecx, %ecx
    movb (%ebx), %ch
    subb $0x30, %ch # переводимо символ ascii в число

    movl -12(%ebp), %eax
    mull -4(%ebp)
    movl %eax, -4(%ebp)
    addb %ch, -4(%ebp)
    incl %ebx
.string_to_digitCMP:
    cmpb $0xa, (%ebx) # якщо символ строки == '\n' - строка закінчена
    jne .string_to_digitLBODY

    movl -4(%ebp), %eax # повертаємо результат роботи ф-ції

    movl %ebp, %esp
    popl %ebp
    ret

__stdin:              # stdin(var)
    pushl %ebp
    movl %esp, %ebp

    movl $400, %eax
    movl 8(%ebp), %ebx # змінна var
    jmp .__stdinCMP
.__stdinLBODY:
    movl $0, (%ebx) # ініціалізація стека буфера нулями
    addl $4, %ebx
    subl $4, %eax
.__stdinCMP:
    cmpl $0, %eax
    jg .__stdinLBODY

    movl $3, %eax
    movl $0, %ebx
    movl 8(%ebp), %ecx
    movl $400, %edx # кількість символів, які будуть прочитані із стандартного вводу
    int $0x80

    movl %ebp, %esp
    popl %ebp
    ret

stdin:
    pushl %ebp
    movl %esp, %ebp

    subl $400, %esp # резервуємо місце під введені дані - 400 символів

    pushl %esp
    call __stdin

    call string_to_digit

    movl %ebp, %esp
    popl %ebp
    ret
